컴퓨터과학

어셈블리_10_문자열 참조와 교차 참조(X-Ref) 분석

작성자 : Heehyeon Yoo|2025-10-24
# Assembly# Ghidra# X-Ref# Strings

바이너리 분석 시 main 함수부터 순차적으로 분석하는 것은 프로그램 규모가 커질수록 비효율적이다. 대신 "명확한 단서"를 찾아 로직을 역추적하는 접근법이 유효하다. 가장 직관적이고 강력한 단서는 문자열(String)이다.

프로그램은 사용자 인터페이스를 위해 반드시 문자열을 포함한다.

  • "Password Incorrect"
  • "Success!"

이러한 문자열은 컴파일 시 .rodata.data 영역에 저장된다. Ghidra의 Search -> For Strings 기능을 이용하면 바이너리 내 모든 문자열을 목록화할 수 있다.

2. 교차 참조(Cross-Reference, X-Ref)

문자열 자체보다 중요한 것은 "해당 문자열을 사용하는 코드의 위치"다.
Ghidra에서 문자열을 선택하고 XREF 정보를 확인하면, 이 데이터를 참조하는 함수와 주소를 알 수 있다.

                             XREF[1]:     check_password:00401050 (R)  
ds "Correct!"

위 정보는 "check_password 함수의 00401050 번지에서 이 문자열을 읽고 있다"는 의미다. 해당 위치로 이동하면 인증 성공 시 메시지를 출력하는 로직을 발견할 수 있다.

if (is_valid) {
    puts("Correct!"); // <- X-Ref를 통해 도달한 위치
}

이 방식을 사용하면 인증 로직(if (is_valid))의 위치를 즉시 특정할 수 있다. 단, 문자열이 암호화되어 있거나 동적으로 생성되는 경우에는 API 호출 추적 등 다른 기법을 병행해야 한다.

스택 문자열 (Stack Strings)
일부 악성코드나 보호 기법은 문자열 검색을 피하기 위해, 문자열을 한 글자씩 스택에 밀어 넣어서 동적으로 생성한다.

mov [rbp-0x4], 'F'
mov [rbp-0x3], 'l'
mov [rbp-0x2], 'a'
mov [rbp-0x1], 'g'

이런 경우 단순 문자열 검색(Strings)으로는 'Flag'라는 단어가 보이지 않는다. 이때는 메모리 덤프나 디컴파일 코드를 직접 확인해야 한다.